//  一、
var a = [];
for(var i = 0; i < 10; i++) {
  a[i] = function() {
    console.log(i)
  }
}
a[6]()

//  结果 10

// i 挂载在全局，for每次循环都会执行i++，for执行完后i = 10 ，a[6]()执行自己本身没有定义i ，往上找到的是全局的i，也就是10


// 二、
var tmp = 123;
if (true) {
  console.log(tmp);
  let tmp;
}

//  会报错不能在声明前使用 
//  tmp 会在当前if作用域内查找，发现有let tmp; 变量提升，所以取不到全局的tmp


// 三、
var arr = [12, 34, 32, 89, 4]

console.log(Math.min(...arr))


// 四、
// var 挂载在全局作用域
// let 挂载在当前作用域
// const 只读常量，声明后就不可以修改 ，不能修改内存地址 ，其他和let相同



// 五、
var a = 10;
var obj = {
  a: 20,
  fn() {
    setTimeout(() => {
      console.log(this.a)
    })
  }
}
obj.fn()

// 结果 20
// 因为调用fn的是obj，所以this指向obj


// 六、
// Symbol生成一个独一无二的全新数值，可以避免属性名重复的问题
// 可以作为私有属性来用，在外部无法访问到
// 例如：

let obj2 = {
	[Symbol()]:123,
	foo: 'foo'
}
for (let key in obj2) {
	console.log(key)
}


// 七、
// 浅拷贝： 创建新的一个变量，指向拷贝的变量，也就是存了个内存地址，地址指向被拷贝变量的内容
// 深拷贝： 新申请一片内存空间，完全复制一份被拷贝对象，包括内容


// 八、
// TypeScript是JavaScript的一个超集，扩展了 JavaScript 的语法


// 九、
// typescript优缺点
// 优点：类型安全可以在代码编写时就能检测出部分错误，创建了一个更高效的编码和调试过程
// 可以编译成需要的不同版本 甚至能兼容到es3

// 缺点：增加了学习成本
// 增加了开发成本，毕竟要多写一些类型的定义



// 十、描述引用计数的工作原理和优缺点
// 内部维护了一个对象的引用关系的引用计数器，当前对象引用为0，GC就会把这块空间回收
// 优点： 一旦发现垃圾就立即回收，
// 				能在内存将要占满的时候可以立即调用GC对引用为0的对象进行回收，减少程序暂停
// 缺点： 维护引用计数器时间消耗会比其他GC算法大一些，
// 				无法回收循环引用的对象



// 十一、描述标记整理算法的工作流程
// 1.遍历所有的对象，找出可达活动对象，
// 2.整理所以活动对象，移动位置使地址连续
// 3.再把垃圾回收，这样回收的空间就基本上就是连续的



// 十二、描述V8中新生代存储区垃圾回收的流程
// 采用复制算法和标记整理
// 把新生代内存分为两个等大的空间，使用空间为From，空闲空间为To，活动对象都存储于From空间
// 当From空间使用到一定程度，GC就对From空间做标记整理操作，便于后续得到的是更多的连续地址
// 整理完后将活动对象拷贝至To
// 将From空间完全释放，把空间置换，即原来的From变成To,原来的To变成From

// 一轮GC还存活的新生代对象通常需要晋升到老生代
// 当To空间的使用率超过25%，也会把活动对象拷贝到老生代



// 十三、描述增量标记算法在何时使用及工作原理
// 在老生代垃圾回收的时候使用
// 垃圾回收操作会阻塞程序执行
// 标记增量算法会把遍历对象进行标记拆分成许多小步与程序的执行交替来完成，以此来提高效率
// 标记完最后再进行回收
